package actions.owners;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.FileUtils;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;

import utils.Propiedades;
import domain.Foto;
import domain.Mesa;
import domain.Municipio;
import domain.Provincia;
import domain.Restaurante;

@Name("restaurantBean")
@SuppressWarnings("all")
@Scope(ScopeType.SESSION)
public class GestionRestauranteAction implements Serializable {

	
	@In
	FacesMessages facesMessages;

	@In
	EntityManager em;

	@In(required = false)
	@Out
	private Restaurante myRestaurant;
	
	@In(required = false)
	@Out
	private Restaurante myRestaurantEdicion;

	
	private Provincia provinciaRestaurante;
	private Municipio municipioRestaurante;
	@In(required = false)
	private Mesa table = new Mesa();

	@In(required = false)
	private Mesa smokingTable = new Mesa();
	
	@DataModel
	private List<Mesa> mesasFumadoresEdicion = new ArrayList<Mesa>(0);

	@DataModel("mesasNoFumadoresEdicion")
	private List<Mesa> mesasNoFumadoresEdicion = new ArrayList<Mesa>(0);

	@DataModel
	private List<Foto> fotosRestauranteEdicion = new ArrayList<Foto>(0);
	
	@DataModelSelection("mesasNoFumadoresEdicion")
	private Mesa noSmokingTableListEdicion;

	@DataModelSelection("mesasFumadoresEdicion")
	private Mesa smokingTableListEdicion;
	
	@DataModelSelection("fotosRestauranteEdicion")
	private Foto fotoEdicion;
	
	private List<Mesa> mesasRestauranteEdicion = new ArrayList<Mesa>(0);
	
	@Out(required = false)
	List<Foto> fotos;

	private String fotoSeleccionada;
	
	private String fotoSelecionadaEdicion;
	
	List<Municipio> municipios;
	
	// Subida de fotos
	private List<UploadItem> fileList = new ArrayList<UploadItem>();
	private final int maxFiles = Integer.valueOf(Propiedades.getInstance().getPropiedad("maxFotos"));


	@Factory("fotos") //Se reutiliza para cargar la info del restaurante
	public List<Foto> cargarFotos() {
		fotos = em.createQuery("FROM Foto f WHERE f.restaurante.restaurante=?")
				.setParameter(1, myRestaurant.getRestaurante()).getResultList();
		
		fotosRestauranteEdicion.clear();
		for (Iterator it = fotos.iterator(); it.hasNext();) {
			Foto f = (Foto) it.next();
			fotosRestauranteEdicion.add(f);
		}
		
		try {
			myRestaurantEdicion = (Restaurante) BeanUtils.cloneBean(myRestaurant);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//
		mesasRestauranteEdicion = em.createQuery("FROM Mesa m WHERE m.restaurante.restaurante=?")
		.setParameter(1, myRestaurant.getRestaurante()).getResultList();
		
		for (Mesa m : mesasRestauranteEdicion) {
			if(m.isPermiteFumar())
				mesasFumadoresEdicion.add(m);
			else
				mesasNoFumadoresEdicion.add(m);
		}
		
		return fotos;
	}
	
	
	
	public void addTable() {
		if (table.getCodigo() == null)
			facesMessages.addToControl("comensales", "mandatory");
		else {
			table.setPermiteFumar(false);
			mesasRestauranteEdicion.add(table);
			try {
				mesasNoFumadoresEdicion.add((Mesa) BeanUtils.cloneBean(table));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void addSmokingTable() {
		if (smokingTable.getCodigo() == null)
			facesMessages.addToControl("comensalesFumadores", "mandatory");
		else {
			smokingTable.setPermiteFumar(true);
			mesasRestauranteEdicion.add(smokingTable);
			try {
				mesasFumadoresEdicion.add((Mesa) BeanUtils.cloneBean(smokingTable));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void uploadFiles(UploadEvent ue) {
		// TODO Investigar como obtener la ruta absoluta para crear un File
		String rutaBase = ((HttpServletRequest) FacesContext
				.getCurrentInstance().getExternalContext().getRequest())
				.getRealPath("/RestaurantsImages");
		byte[] datos;
		UploadItem file = (UploadItem) ue.getUploadItem();

		String rutaFichero = "/Irestaurant-" + (int) (Math.random() * 1000000)
				+ "-" + file.getFileName().replaceAll(" ", "_");
		File f = new File(rutaBase + rutaFichero);

		Foto foto = new Foto();
		foto.setRuta(rutaFichero);

		fotosRestauranteEdicion.add(foto);

		try {
			datos = FileUtils.readFileToByteArray(file.getFile());
			FileUtils.writeByteArrayToFile(f, datos);

		} catch (IOException e) {
			e.printStackTrace();

		}

	}
	
	
	public void deletePicture(){
		fotosRestauranteEdicion.remove(fotoEdicion);
	}

	

	public void removeTables() {
		mesasNoFumadoresEdicion.remove(noSmokingTableListEdicion);
	}

	public void removeSmokingTables() {
		mesasFumadoresEdicion.remove(smokingTableListEdicion);
	}

	public void cancel(){
		try {
			myRestaurantEdicion = (Restaurante) BeanUtils.cloneBean(myRestaurant);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void saveChanges(){
		Restaurante resAux = em.find(Restaurante.class, myRestaurantEdicion.getRestaurante());
		//guardar datos
		resAux.setMunicipio(municipioRestaurante);
		
		//fotos
		for (Iterator it = fotosRestauranteEdicion.iterator(); it.hasNext();) {
			Foto f = (Foto) it.next();
			f.setRestaurante(resAux);
		}
		resAux.getFotos().clear();
		resAux.getFotos().addAll(fotosRestauranteEdicion);
		//mesas
		//campo marcado como eliminada???
		
		for (Mesa m : myRestaurant.getMesas()) {
			if(!mesasRestauranteEdicion.contains(m))
				//invalidar mesa
				;
		}
		
		for (Mesa m : mesasRestauranteEdicion) {
			if(m.getMesa() == null)
				m.setRestaurante(resAux);
				myRestaurant.getMesas().add(m);
		}
		resAux.setCategoria(myRestaurantEdicion.getCategoria());
		resAux.setEmail(myRestaurantEdicion.getEmail());
		resAux.setNombre(myRestaurantEdicion.getNombre());
		resAux.setPermiteFumadores(myRestaurantEdicion.isPermiteFumadores());
		resAux.setTelefono(myRestaurantEdicion.getTelefono());
		
		em.flush();
		
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Municipio> findMunicipios() {

		if (provinciaRestaurante != null) {
			municipios = (List<Municipio>) em.createQuery(
			"FROM Municipio m WHERE m.provincia.provincia = " + provinciaRestaurante.getProvincia()).getResultList();
			
		} else
			// Si no hay provincia seleccionada
			municipios = new ArrayList<Municipio>();

		return municipios;
	}

	public void seleccionarFoto(String seleccion) {
		this.setFotoSeleccionada(seleccion);
	}
	
	public void seleccionarFotoEdicion(String seleccion) {
		this.setFotoSelecionadaEdicion(seleccion);
	}

	public String getFotoSeleccionada() {
		return fotoSeleccionada;
	}

	public void setFotoSeleccionada(String fotoSeleccionada) {
		this.fotoSeleccionada = fotoSeleccionada;
	}

	public Restaurante getMyRestaurant() {
		return myRestaurant;
	}

	public void setMyRestaurant(Restaurante myRestaurant) {
		this.myRestaurant = myRestaurant;
	}

	public Provincia getProvinciaRestaurante() {
		return provinciaRestaurante;
	}

	public void setProvinciaRestaurante(Provincia provinciaRestaurante) {
		this.provinciaRestaurante = provinciaRestaurante;
	}

	public Municipio getMunicipioRestaurante() {
		return municipioRestaurante;
	}

	public void setMunicipioRestaurante(Municipio municipioRestaurante) {
		this.municipioRestaurante = municipioRestaurante;
	}

	public int getMaxFiles() {
		return maxFiles;
	}

	public List<UploadItem> getFileList() {
		return fileList;
	}

	public void setFileList(List<UploadItem> fileList) {
		this.fileList = fileList;
	}



	public String getFotoSelecionadaEdicion() {
		return fotoSelecionadaEdicion;
	}



	public void setFotoSelecionadaEdicion(String fotoSelecionadaEdicion) {
		this.fotoSelecionadaEdicion = fotoSelecionadaEdicion;
	}
}
